#include "bsp_exmc.h"

uint8_t bsp_exmc_port_init(void)
{
    stc_gpio_init_t stcGpioInit;
    GPIO_Unlock();
    /************************* Set pin drive capacity *************************/
    GPIO_StructInit(&stcGpioInit);
    stcGpioInit.u16PinDrv = PIN_DRV_HIGH;
    stcGpioInit.u16PinDir = PIN_DIR_OUT;
    GPIO_Init(SMC_IO1_PORT, SMC_IO1_PIN, &stcGpioInit);
    GPIO_Init(SMC_IO2_PORT, SMC_IO2_PIN, &stcGpioInit);
    GPIO_SetPins(SMC_IO1_PORT, SMC_IO1_PIN);
    GPIO_SetPins(SMC_IO2_PORT, SMC_IO2_PIN);

    /* SMC_CS */
    GPIO_Init(SMC_CS_PORT, SMC_CS_PIN, &stcGpioInit);

    /* SMC_WE */
    GPIO_Init(SMC_WE_PORT, SMC_WE_PIN, &stcGpioInit);

    /* SMC_BLS[0:1] */
    GPIO_Init(SMC_BLS0_PORT, SMC_BLS0_PIN, &stcGpioInit);
    GPIO_Init(SMC_BLS1_PORT, SMC_BLS1_PIN, &stcGpioInit);

    /* SMC_OE */
    GPIO_Init(SMC_OE_PORT, SMC_OE_PIN, &stcGpioInit);

    /* DMC_DATA[0:15] */
    GPIO_Init(SMC_DATA0_PORT, SMC_DATA0_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA1_PORT, SMC_DATA1_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA2_PORT, SMC_DATA2_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA3_PORT, SMC_DATA3_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA4_PORT, SMC_DATA4_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA5_PORT, SMC_DATA5_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA6_PORT, SMC_DATA6_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA7_PORT, SMC_DATA7_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA8_PORT, SMC_DATA8_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA9_PORT, SMC_DATA9_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA10_PORT, SMC_DATA10_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA11_PORT, SMC_DATA11_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA12_PORT, SMC_DATA12_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA13_PORT, SMC_DATA13_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA14_PORT, SMC_DATA14_PIN, &stcGpioInit);
    GPIO_Init(SMC_DATA15_PORT, SMC_DATA15_PIN, &stcGpioInit);

    /* DMC_ADD[0:18]*/
    GPIO_Init(SMC_ADD0_PORT, SMC_ADD0_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD1_PORT, SMC_ADD1_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD2_PORT, SMC_ADD2_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD3_PORT, SMC_ADD3_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD4_PORT, SMC_ADD4_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD5_PORT, SMC_ADD5_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD6_PORT, SMC_ADD6_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD7_PORT, SMC_ADD7_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD8_PORT, SMC_ADD8_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD9_PORT, SMC_ADD9_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD10_PORT, SMC_ADD10_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD11_PORT, SMC_ADD11_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD12_PORT, SMC_ADD12_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD13_PORT, SMC_ADD13_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD14_PORT, SMC_ADD14_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD15_PORT, SMC_ADD15_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD16_PORT, SMC_ADD16_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD17_PORT, SMC_ADD17_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD18_PORT, SMC_ADD18_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD19_PORT, SMC_ADD19_PIN, &stcGpioInit);
    GPIO_Init(SMC_ADD20_PORT, SMC_ADD20_PIN, &stcGpioInit);

    /************************** Set EXMC pin function *************************/
    /* SMC_CS */
    GPIO_SetFunc(SMC_CS_PORT, SMC_CS_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);

    /* SMC_WE */
    GPIO_SetFunc(SMC_WE_PORT, SMC_WE_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);

    /* SMC_BLS[0:1] */
    GPIO_SetFunc(SMC_BLS0_PORT, SMC_BLS0_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_BLS1_PORT, SMC_BLS1_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);

    /* SMC_OE */
    GPIO_SetFunc(SMC_OE_PORT, SMC_OE_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);

    /* SMC_DATA[0:15] */
    GPIO_SetFunc(SMC_DATA0_PORT, SMC_DATA0_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA1_PORT, SMC_DATA1_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA2_PORT, SMC_DATA2_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA3_PORT, SMC_DATA3_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA4_PORT, SMC_DATA4_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA5_PORT, SMC_DATA5_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA6_PORT, SMC_DATA6_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA7_PORT, SMC_DATA7_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA8_PORT, SMC_DATA8_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA9_PORT, SMC_DATA9_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA10_PORT, SMC_DATA10_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA11_PORT, SMC_DATA11_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA12_PORT, SMC_DATA12_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA13_PORT, SMC_DATA13_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA14_PORT, SMC_DATA14_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_DATA15_PORT, SMC_DATA15_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);

    /* SMC_ADD[0:18]*/
    GPIO_SetFunc(SMC_ADD0_PORT, SMC_ADD0_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD1_PORT, SMC_ADD1_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD2_PORT, SMC_ADD2_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD3_PORT, SMC_ADD3_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD4_PORT, SMC_ADD4_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD5_PORT, SMC_ADD5_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD6_PORT, SMC_ADD6_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD7_PORT, SMC_ADD7_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD8_PORT, SMC_ADD8_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD9_PORT, SMC_ADD9_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD10_PORT, SMC_ADD10_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD11_PORT, SMC_ADD11_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD12_PORT, SMC_ADD12_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD13_PORT, SMC_ADD13_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD14_PORT, SMC_ADD14_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD15_PORT, SMC_ADD15_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD16_PORT, SMC_ADD16_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD17_PORT, SMC_ADD17_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD18_PORT, SMC_ADD18_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD19_PORT, SMC_ADD19_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_SetFunc(SMC_ADD20_PORT, SMC_ADD20_PIN, GPIO_FUNC_12_EXMC, PIN_SUBFUNC_DISABLE);
    GPIO_Lock();
    return Ok;
}

uint8_t bsp_exmc_init(void)
{
    PWC_Unlock(PWC_UNLOCK_CODE_0 | PWC_UNLOCK_CODE_1 | PWC_UNLOCK_CODE_2);
    PWC_Fcg3PeriphClockCmd(PWC_FCG3_SMC, Enable);    
    PWC_Lock(PWC_UNLOCK_CODE_0 | PWC_UNLOCK_CODE_1 | PWC_UNLOCK_CODE_2);
    
    EXMC_SMC_Cmd(Enable);
    return Ok;
}

